/*
 * parse.h
 *
 *   Created on: 2011-10-2
 *       Author: 左白
 *  Description: 词法分析,语法分析,语义分析公用头文件
 */

#ifndef PARSE_H_
#define PARSE_H_

#include "zach.h"
namespace zach
{
// 字符在文本中的位置
struct TextPosition
{
	int col; // 列
	int row; // 行
};

// 宏,文件定位
#define FILEPOSITION( file, pos )\
	file, pos

// 分析错误,包括该错误所在的文件,在文件中的位置以及错误描述
struct ParseError
{
	ParseError( const string& iFilePath, TextPosition iPos, int iErrorNumber, const string& iDescription ) :
			pos( iPos ), description( iDescription ), filePath( iFilePath ), errorNumber( iErrorNumber )
	{
	}

	TextPosition pos; // 位置
	string description; // 原因
	string filePath; // 文件路径
	int errorNumber; // 错误号码
};

string toString( ParseError parseError );
inline void die( ParseError parseError )
{
	throw OutOfDomain( toString( parseError ) );
}

void die( vector<ParseError> errors );

#if (1) /* 词法部分 */
// 词法词的类型
namespace lexType
{
enum LexType
{
	INT, DOUBLE, STRING, CHAR, TOKEN, LINE_ANNOTATION, BLOCK_ANNOTATION, Comma, Less, LessEqual, LessLessEqual, Period, Great, GreatEqual, GreatGreat,
	GreatGreatEqual, GreatGreatGreat, GreatGreatGreatEqual, Div, DivEqual, Question, Colon, Semicolon, LeftBig, LeftSquare, RightBig, RightSquare, Or,
	OrOr, OrEqual, Negate, Not, NotEqual, At, Sharp, Dollar, Mod, ModEqual, Xor, XorEqual, And, AndAnd, AndEqual, Mul, MulEqual, LeftRound,
	RightRound, Sub, SubSub, SubEqual, Add, AddAdd, AddEqual, Equal, EqualEqual, True, False, If, Trait, E, ENUMEND
};
}
typedef lexType::LexType LexType;

// 词法词,词法分析的结果
struct LexWord
{
	LexWord()
	{
	}

	LexWord( LexType iType, TextPosition iPos, String iString ) :
			type( iType ), pos( iPos ), string( iString )
	{
	}

	LexType type; // 类型
	TextPosition pos; // 在源代码中的位置
	String string; // 字符串
};

typedef vector<LexWord> LexWords; // 词法词数组

// 词法文本
struct LexText
{
	LexText( string iFilePath, const LexWords& iText ) :
			filePath( iFilePath ), text( iText )
	{
	}

	LexText()
	{
	}

	string filePath;
	LexWords text;
};

LexText parseLex( const string& path ); // 对目标流进行词法分析,分析结果是一个词法文本
#endif /* 词法部分 */

#if (1) /* 语法部分 */
class SyntaxText
{

};

// 语法分析
SyntaxText parseSyntax( LexText lexText );
#endif /* 语法部分 */

#if (1) /* 错误代码 */
namespace errorNumber
{
const int INVALID_CHAR = 1;
const int INVALID_ESCAPE_CHAR = 2;
const int UNMATCHED_SINGLE_QUOTES = 3;
const int SUPERFLUOUS_CHAR_IN_SINGLE_QUOTES_PAIR = 4;
const int UNMATHCED_DOUBLE_QUOTES = 5;
const int EMPTY_IN_SINGLE_QUOTES_PAIR = 6;
const int LINE_FEED_IN_SINGLE_QUOTES_PAIR = 7;
const int LINE_FEED_IN_DOUBLE_QUOTES_PAIR = 8;
const int UNRECOGNIZED_CHAR_SEQUENCE_EXPECTED_LESS = 9;
const int UNFINSHED_VBSTRING = 10;
const int UNFINSHED_LINE_ANNOTATION = 11;
const int UNFINSHED_BLOCK_ANNOTATION = 12;
const int WRONG_DECIMAL_FORM = 13;
}
;
#endif /* 错误代码 */
}

#endif /* PARSE_H_ */
